home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Graphics Plus
/
Graphics Plus.iso
/
msdos
/
plotting
/
pcgplots
/
cgmio.h
< prev
next >
Wrap
C/C++ Source or Header
|
1992-04-24
|
15KB
|
398 lines
// C++ .h file for gplot, CGM-specific I/O -*-c++-*-
// copyright Phil Andrews, Pittsburgh Supercomputing Center, 1992
// all rights reserved
#ifndef cgmio_h
#define cgmio_h
#include <stdio.h>
#include <string.h>
#include "cgm.h"
#if __MSDOS__
#include <io.h>
#endif
#include "basicio.h"
#ifdef macintosh
# include <UMacApp.h>
# include <errors.h>
#endif
////
// definitions for input, output
////
enum {clearCGM, binaryCGM}; // for identification
////
// typedef for parsing array
////
typedef baseCGM *(*parseFp)(cgmContainer*, cgmInput*, baseCGM*);
////
// structure for parsing table
////
class cgmNameNew {
public:
// default constructor, (default arguments not implemented in arrays)
cgmNameNew() {myName=NULL; myClass=0; myElement=0; fp=NULL;}
// real constructor
cgmNameNew(const char **inName, int inClass, int inElement, parseFp inFp)
{myName=inName; myClass=inClass; myElement=inElement; fp=inFp;}
const char **myName; // clear text name
int myClass; // cgm class
int myElement; // cgm element
// function to create new element
parseFp fp;
};
////
// basic cgm input class
////
class cgmInput : public basicInput {
public:
cgmInput(const char *inName, short refHand=0)
: basicInput(inName, refHand) {initialize();}
cgmInput(FILE *inPtr, short refHand=0, int offset=0)
: basicInput(inPtr, refHand, offset) {initialize();}
void initialize(); // initialize constants
// the pure virtual functions, required of all descendants
virtual int isa() = 0;
#if __MSDOS__
virtual HugePt getCmd() = 0; // get the next command
#else
virtual unsigned char *getCmd() = 0; // get the next command
#endif
virtual char *getString(int&) = 0; // get a string from input
virtual int getInt(int = 0) = 0; // get an integer from input
virtual float getReal() = 0; // get a real from input
virtual float getFP() = 0; // get a floating point real from input
virtual int getE() = 0; // get an enumerated int
virtual int getType(const char**, int) = 0; // check for possible types
virtual void getIntPrec(intPrec*) = 0; // get the integer precision
virtual void getIntPrec(uIntPrec*) = 0; // get the unsigned integer precision
virtual void getRealPrec(realPrec*) = 0; // get the real precision
virtual unsigned int getCD(int = 0) = 0; // direct colour component
virtual unsigned int getCI(int = 0) = 0; // indexed colour
virtual int getVIP() = 0; // VDC at integer precision
virtual float getVRP() = 0; // VDC at real precision
virtual int getNoPts() = 0; // how many vdc points to come ?
virtual int polygonSetSize() = 0; // how many points in the polyset ?
virtual int getPt(float*) = 0; // get one real vdc point
virtual int getPt(int*) = 0; // get one integer vdc point
virtual int getNoDColrs() = 0; // how many direct colours to get
virtual cgmDefaults *getDefaults(cgmMetafile*) = 0; // get metafile defaults
virtual const char *cmdSignature() = 0; // diagnostic
// get a cell array
virtual cellArray *getCellArray(int, const colrValueExtent*,
const colrTable*) = 0;
////
// default functions
////
virtual baseCGM *doCmd(cgmContainer*, baseCGM*); // interpret the command
// get a direct colour
virtual void getDColr(dColr&);
// get a general colour
virtual genColr *getColr(int, const colrValueExtent*, const colrTable*);
// get a single VDC measure
virtual vdc *getVdc();
// get a set of VDC points
virtual vdcPts *getVdcPts(int=0);
// get a colour table
virtual colrTable *getColrTable(const colrValueExtent*);
virtual int padCmd() {return 0;} // ignore this ?
virtual void makeIndex(cgmMetafile*); // create an index
////
// values needed for input parsing
// default values
intPrec defIntPrec; // default integer precision
uIntPrec defColrPrec; // default colour precision
uIntPrec defColrIndexPrec; // default colour index precision
realPrec defRealPrec; // default real precision
intPrec defVdcIntPrec; // default VDC integer precision
realPrec defVdcRealPrec; // default VDC integer precision
////
// overriding commands
cgmVdcType *vdcTypeCmd; // vdc type, integer or real
cgmIntegerPrec *intPrecCmd;
cgmRealPrec *realPrecCmd;
cgmIndexPrec *indexPrecCmd; // index precision
cgmColrPrec *colrPrecCmd; // colour precision
cgmColrIndexPrec *colrIndexPrecCmd; // colour index precision
cgmVdcInteger *vdcIntPrecCmd, *defVdcIntPrecCmd;
cgmVdcReal *vdcRealPrecCmd, *defVdcRealPrecCmd;
////
// the functions to get the precisions
virtual vdcType myVdcType() {return vdcTypeCmd ? vdcTypeCmd->myType : 0;}
virtual intPrec& myIntPrec()
{return intPrecCmd ? intPrecCmd->thisPrec : defIntPrec;}
virtual realPrec& myRealPrec()
{return realPrecCmd ? realPrecCmd->thisPrec : defRealPrec;}
virtual intPrec& indexPrec()
{return indexPrecCmd ? indexPrecCmd->thisPrec : defIntPrec;}
virtual uIntPrec& colrPrec()
{return colrPrecCmd ? colrPrecCmd->thisPrec : defColrPrec;}
virtual uIntPrec& colrIndexPrec()
{return colrIndexPrecCmd ? colrIndexPrecCmd->thisPrec : defColrIndexPrec;}
virtual intPrec& vdcIntPrec()
{return vdcIntPrecCmd ? vdcIntPrecCmd->thisPrec :
defVdcIntPrecCmd ? defVdcIntPrecCmd->thisPrec : defVdcIntPrec;}
virtual realPrec& vdcRealPrec()
{return vdcRealPrecCmd ? vdcRealPrecCmd->thisPrec :
defVdcRealPrecCmd ? defVdcRealPrecCmd->thisPrec : defVdcRealPrec;}
////
static const int cgmNoClasses; // size of parsing array
// get a polygon set
virtual void polygonSet(vdcPts*&, int*&);
protected:
static cgmNameNew* cgmNameArray; // parsing info array
static int beginPictureIndex, endMetafileIndex;
static void initNameArray(); // initialize the name array
virtual int sameCmd(const cgmNameNew&) = 0; // match the command
// local flags
int inputError; // did we get an error ?
static const int noErrors;
static const int noSep;
static const int skipParen;
};
////
// the basic clear text info, used for input parsing and output
////
class clearInfo {
protected:
static const char termChar, termChar1, quoteChar, quoteChar1, sepChar,
sepChar1, sepChar2, sepChar3, sepChar4, sepChar5, sepChar6, nullChar,
nullChar1, commentChar; // the constant values, defined in cgmio.cc
int isTerm(const char c) {return (c==termChar)||(c==termChar1);}
int isQuote(const char c) {return (c==quoteChar)||(c==quoteChar1);}
int isSep(const char c) {return (c==sepChar) || (c==sepChar6) ||
((c>=sepChar1) && (c<=sepChar5));}
int isNull(const char c) {return (c==nullChar)||(c==nullChar1);}
int isComment(const char c) {return (c==commentChar);}
};
////
// input class for clear text
////
class clearInput : public cgmInput, public clearInfo {
public:
clearInput(const char *inName, short refHand=0)
: cgmInput(inName, refHand) {}
clearInput(FILE *inPtr, short refHand=0, int offset=0)
: cgmInput(inPtr, refHand, offset) {}
// the required functions
virtual int isa() {return clearCGM;}
#if __MSDOS__
virtual HugePt getCmd();
#else
virtual unsigned char *getCmd();
#endif
virtual char *getString(int&);
virtual int getInt(int = 0);
virtual float getReal();
virtual float getFP() {return getReal();}
virtual int getType(const char**, int);
virtual void getIntPrec(intPrec*);
virtual void getIntPrec(uIntPrec*);
virtual void getRealPrec(realPrec*);
virtual unsigned int getCD(int flag = 0) {return getInt(flag);}
virtual unsigned int getCI(int flag = 0) {return getInt(flag);}
virtual int getVIP() {return getInt();}
virtual float getVRP() {return getReal();}
virtual int getE() {return getInt();}
virtual int getNoDColrs() {return getNoTokens() / 3;}
virtual cgmDefaults *getDefaults(cgmMetafile*);
virtual const char *cmdSignature() {return (const char *) buffer;}
// get a cell array
virtual cellArray *getCellArray(int, const colrValueExtent*,
const colrTable*);
virtual long thisSize() {return bIndex;}
private:
virtual int sameCmd(const cgmNameNew &inName)
{return same(*(inName.myName));}
virtual int same(const char*);
int getDecimal();
long getLongDecimal();
int getBased(int);
int getNoTokens();
virtual int getNoPts();
virtual int polygonSetSize();
virtual int getPt(float*);
virtual int getPt(int*);
};
////
// input class for binary format
////
class binaryInput : public cgmInput {
public:
binaryInput(const char *inName, short refHand=0)
: cgmInput(inName, refHand) {}
binaryInput(FILE* inPtr, short refHand=0, int offset=0)
: cgmInput(inPtr, refHand, offset) {}
~binaryInput();
// required functions
virtual int isa() {return binaryCGM;}
#if __MSDOS__
virtual HugePt getCmd();
#else
virtual unsigned char *getCmd();
#endif
virtual char *getString(int&);
virtual int getInt(int = 0) {return gInt(myIntPrec().noBytes);}
virtual int getShiftInt(int bitShift= 0)
{return gShiftInt(myIntPrec().noBytes, bitShift);}
virtual float getReal() {return gReal(myRealPrec());}
virtual float getFP() {return gFP(myRealPrec());}
virtual int getType(const char**, int) {return getE();}
virtual void getIntPrec(intPrec *inPrec)
{inPrec->noBytes = getInt() / 8;}
virtual void getIntPrec(uIntPrec *inPrec)
{inPrec->noBytes = getInt() / 8;}
virtual void getRealPrec(realPrec*);
virtual int getE() {return gInt(2);}
virtual unsigned int getCD(int = 0) {return gUInt(colrPrec().noBytes);}
virtual unsigned int getCI(int = 0) {return gUInt(colrIndexPrec().noBytes);}
virtual int getVIP() {return gInt(vdcIntPrec().noBytes);}
virtual float getVRP() {return gReal(vdcRealPrec());}
virtual int getNoPts();
virtual int polygonSetSize();
virtual int getPt(float*);
virtual int getPt(int*);
virtual int getNoDColrs() // how many direct colours to come ?
{return (bIndex<=aIndex) ? 0 : (bIndex-aIndex)/(3 * colrPrec().noBytes);}
virtual cgmDefaults *getDefaults(cgmMetafile*);
virtual const char *cmdSignature();
virtual int padCmd() {return !(bufferClass() && bufferElement());}
virtual int sameCmd(const cgmNameNew &inCmd)
{return (bufferClass() == inCmd.myClass) &&
(bufferElement() == inCmd.myElement);}
// get a cell array
virtual cellArray *getCellArray(int, const colrValueExtent*,
const colrTable*);
virtual long thisSize() {return (bIndex % 2) ? bIndex + 1 : bIndex;}
// local functions
unsigned int bufferClass() {return buffer[0] >> 4;}
unsigned int bufferElement()
{return ((buffer[0] << 3) & 127) + (buffer[1] >> 5);}
protected:
unsigned int gUInt(int); // general unsigned integer
int gInt(int); // general signed integer
int gShiftInt(int, int); // general shifted signed integer
float gReal(realPrec &inPrec) // general real
{return inPrec.format ? gFX(inPrec) : gFP(inPrec);}
float gFP(realPrec&); // general floating point real
float gFX(realPrec&); // general fixed point real
};
////
// now some derivative binary variations
////
#define NCARSIZE 1440 /* NCAR comes in chunks this size */
class NCARInput : public binaryInput { // NCAR format
public:
NCARInput(const char *inName, short refHand=0)
: binaryInput(inName, refHand) {initialize();}
NCARInput(FILE *inPtr, short refHand=0, int offset=0)
: binaryInput(inPtr, refHand, offset) {initialize();}
virtual int getOffBytes(unsigned int noBytes, unsigned long offset=0);
protected:
void initialize();
unsigned char localBuffer[NCARSIZE];
unsigned int startIndex, endIndex;
int fillLocalBuffer();
};
class MilInput : public binaryInput { // military format
public:
MilInput(const char *inName, short refHand=0)
: binaryInput(inName, refHand) {}
MilInput(FILE *inPtr, short refHand=0, int offset=560) // 560 = 7 * 80 lines
: binaryInput(inPtr, refHand, offset) {}
};
class LANLInput : public binaryInput { // LANL format
public:
LANLInput(const char *inName, short refHand=0)
: binaryInput(inName, refHand) {}
LANLInput(FILE *inPtr, short refHand=0, int offset=360)
: binaryInput(inPtr, refHand, offset) {}
};
////
// class to hold a complete cgm file
////
class cgmFile : public basicInput {
public:
cgmFile(const char *inName = NULL, short file_ref_num = NULL);
~cgmFile();
cgmMetafile *foundMetafile() {return metafile;}
const char *name() {return inputName;}
private:
char *inputName;
int nameSize;
cgmInput *inputHandler;
cgmMetafile *metafile;
cgmInput *getCgmInput();
};
////
// basic cgm output class
////
class cgmOutput {
public:
virtual int startCmd(baseCGM*) = 0;
virtual int endCmd() = 0;
virtual int outString(const char*) = 0;
virtual int outInt(int, int = 0) = 0;
virtual int outReal(float) = 0;
virtual int outType(const char**, int) = 0;
virtual int outIntPrec(intPrec*) = 0;
virtual int outIntPrec(uIntPrec*) = 0;
virtual int outRealPrec(realPrec*) = 0;
virtual int outDColr(dColr&) = 0;
virtual int outVdc(const vdc*) = 0; // output a single VDC
virtual int outVdcPts(const vdcPts*) = 0; // output a set of VDC points
virtual int outColr(genColr*) = 0; // output a general colour
virtual int outCellArray(cellArray*) = 0; // output a cell array
virtual int polygonSet(const vdcPts*, const int*); // polygon set
virtual int outColrTable(colrTable*) = 0; // output a colour table
virtual int outDefaults(cgmDefaults*) = 0; // output set of defaults
};
////
// output class for clear text
////
class clearOutput : public cgmOutput, public clearInfo, public basicOutput {
public:
clearOutput(const char *inName, short ref_num=0)
: basicOutput(inName, ref_num) {}
virtual int startCmd(baseCGM*);
virtual int endCmd();
int outString(const char*);
virtual int outInt(int inVal, int noSep = 0)
{return textIntOut(inVal, noSep);}
virtual int outReal(float inVal) {return textRealOut(inVal);}
virtual int outType(const char**, int);
virtual int outIntPrec(intPrec*);
virtual int outIntPrec(uIntPrec*);
virtual int outRealPrec(realPrec*);
virtual int outDColr(dColr&);
virtual int outVdcPts(const vdcPts*);
virtual int outVdc(const vdc*);
virtual int outColr(genColr*);
virtual int outCellArray(cellArray*);
virtual int outColrTable(colrTable*);
virtual int outDefaults(cgmDefaults*);
};
////
// output class for binary output
////
class binaryOutput {
public:
// the required functions
virtual int startCmd(baseCGM*);
virtual int endCmd();
virtual int outString(const char*);
virtual int outInt(int, int = 0) = 0;
virtual int outReal(float) = 0;
virtual int outType(const char**, int);
virtual int outIntPrec(intPrec*) = 0;
virtual int outIntPrec(uIntPrec*) = 0;
virtual int outRealPrec(realPrec*) = 0;
virtual int outDColr(dColr&) = 0;
virtual int outVdc(const vdc*) = 0; // output a single VDC
virtual int outVdcPts(const vdcPts*) = 0; // output a set of VDC points
virtual int outColr(genColr*) = 0; // output a general colour
virtual int outCellArray(cellArray*) = 0; // output a cell array
virtual int outColrTable(colrTable*) = 0; // output a colour table
virtual int outDefaults(cgmDefaults*) = 0; // output set of defaults
protected:
// binary specific functions
};
#endif /* cgmio_h */